load libraries

In [1]:
import os
import cv2
import glob
import numpy as np
from keras.models import *
from keras.layers import *
from keras.applications import *
from keras.preprocessing.image import *
Using TensorFlow backend.

加载数据集

In [2]:
basedir = "/ext/Data/distracted_driver_detection/"

model_image_size = 299

print("-------- loading train data")
X_train = list()
y_train = list()
for i in range(10):
    dir = os.path.join(basedir, "train", "c%d"%i)
    image_files = glob.glob(os.path.join(dir,"*.jpg"))
    print("loding {}, image count={}".format(dir, len(image_files)))
    for image_file in image_files:
        image = cv2.imread(image_file)
        X_train.append(cv2.resize(image, (model_image_size, model_image_size)))
        label = np.zeros(10, dtype=np.uint8)
        label[i]=1
        y_train.append(label)
X_train = np.array(X_train)
y_train = np.array(y_train)
        
print("-------- loading valid data")
X_valid = list()
y_valid = list()
for i in range(10):
    dir = os.path.join(basedir, "valid", "c%d"%i)
    image_files = glob.glob(os.path.join(dir,"*.jpg"))
    print("loding {}, image count={}".format(dir, len(image_files)))
    for image_file in image_files:
        image = cv2.imread(image_file)
        X_valid.append(cv2.resize(image, (model_image_size, model_image_size)))
        label = np.zeros(10, dtype=np.uint8)
        label[i]=1
        y_valid.append(label)
X_valid = np.array(X_valid)
y_valid = np.array(y_valid)
-------- loading train data
loding /ext/Data/distracted_driver_detection/train/c0, image count=2308
loding /ext/Data/distracted_driver_detection/train/c1, image count=2096
loding /ext/Data/distracted_driver_detection/train/c2, image count=2136
loding /ext/Data/distracted_driver_detection/train/c3, image count=2185
loding /ext/Data/distracted_driver_detection/train/c4, image count=2160
loding /ext/Data/distracted_driver_detection/train/c5, image count=2152
loding /ext/Data/distracted_driver_detection/train/c6, image count=2164
loding /ext/Data/distracted_driver_detection/train/c7, image count=1843
loding /ext/Data/distracted_driver_detection/train/c8, image count=1771
loding /ext/Data/distracted_driver_detection/train/c9, image count=1972
-------- loading valid data
loding /ext/Data/distracted_driver_detection/valid/c0, image count=181
loding /ext/Data/distracted_driver_detection/valid/c1, image count=171
loding /ext/Data/distracted_driver_detection/valid/c2, image count=181
loding /ext/Data/distracted_driver_detection/valid/c3, image count=161
loding /ext/Data/distracted_driver_detection/valid/c4, image count=166
loding /ext/Data/distracted_driver_detection/valid/c5, image count=160
loding /ext/Data/distracted_driver_detection/valid/c6, image count=161
loding /ext/Data/distracted_driver_detection/valid/c7, image count=159
loding /ext/Data/distracted_driver_detection/valid/c8, image count=140
loding /ext/Data/distracted_driver_detection/valid/c9, image count=157

分为训练集和验证集

In [7]:
print(X_train.shape)
print(y_train.shape)
print(X_valid.shape)
print(y_valid.shape)
(20787, 299, 299, 3)
(20787, 10)
(1637, 299, 299, 3)
(1637, 10)
In [8]:
base_model = InceptionV3(input_tensor=Input((model_image_size, model_image_size, 3)), weights='imagenet', include_top=False)

for layers in base_model.layers:
    layers.trainable = False

x = GlobalAveragePooling2D()(base_model.output)
x = Dropout(0.25)(x)
x = Dense(10, activation='softmax')(x)
model = Model(base_model.input, x)
model.compile(optimizer='adadelta', loss='binary_crossentropy', metrics=['accuracy'])

#     model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
print("done")
done

训练模型

In [9]:
model.fit(X_train, y_train, batch_size=16, epochs=10, validation_data=(X_valid, y_valid))

model.save("models/inceptionV3-mymodel.h5")
Train on 20787 samples, validate on 1637 samples
Epoch 1/10
20787/20787 [==============================] - 138s - loss: 0.2622 - acc: 0.9044 - val_loss: 0.3066 - val_acc: 0.8996 - ETA: 236s - loss: 0.3344 - acc: 0.9000 - ETA: 144s - loss: 0.3307 - acc: 0.9000 - ETA: 121s - loss: 0.3223 - acc: 0.9000 - ETA: 118s - loss: 0.3203 - acc: 0.9000 - ETA: 117s - loss: 0.3201 - acc: 0.9000 - ETA: 116s - loss: 0.3198 - acc: 0.9000 - ETA: 116s - loss: 0.3195 - acc: 0.9000 - ETA: 114s - loss: 0.3184 - acc: 0.9000 - ETA: 111s - loss: 0.3166 - acc: 0.9000 - ETA: 109s - loss: 0.3155 - acc: 0.9000 - ETA: 108s - loss: 0.3152 - acc: 0.9000 - ETA: 105s - loss: 0.3138 - acc: 0.9000 - ETA: 103s - loss: 0.3120 - acc: 0.9000 - ETA: 102s - loss: 0.3118 - acc: 0.9000 - ETA: 92s - loss: 0.3056 - acc: 0.9001 - ETA: 91s - loss: 0.3053 - acc: 0.9001 - ETA: 80s - loss: 0.2984 - acc: 0.9003 - ETA: 74s - loss: 0.2955 - acc: 0.9004 - ETA: 74s - loss: 0.2954 - acc: 0.9004 - ETA: 71s - loss: 0.2940 - acc: 0.9005 - ETA: 56s - loss: 0.2860 - acc: 0.9009
Epoch 2/10
20787/20787 [==============================] - 134s - loss: 0.1913 - acc: 0.9250 - val_loss: 0.2891 - val_acc: 0.9017
Epoch 3/10
20787/20787 [==============================] - 133s - loss: 0.1612 - acc: 0.9398 - val_loss: 0.2820 - val_acc: 0.9011 - ETA: 123s - loss: 0.1787 - acc: 0.9313 - ETA: 8s - loss: 0.1620 - acc: 0.9395
Epoch 4/10
20787/20787 [==============================] - 133s - loss: 0.1443 - acc: 0.9472 - val_loss: 0.2856 - val_acc: 0.9015 - ETA: 65s - loss: 0.1498 - acc: 0.9446 - ETA: 60s - loss: 0.1493 - acc: 0.9448 - ETA: 11s - loss: 0.1450 - acc: 0.9469
Epoch 5/10
20787/20787 [==============================] - 129s - loss: 0.1328 - acc: 0.9517 - val_loss: 0.2814 - val_acc: 0.9041
Epoch 6/10
20787/20787 [==============================] - 129s - loss: 0.1258 - acc: 0.9547 - val_loss: 0.3046 - val_acc: 0.8915
Epoch 7/10
20787/20787 [==============================] - 129s - loss: 0.1203 - acc: 0.9563 - val_loss: 0.3078 - val_acc: 0.8888
Epoch 8/10
20787/20787 [==============================] - 128s - loss: 0.1157 - acc: 0.9585 - val_loss: 0.2973 - val_acc: 0.8958
Epoch 9/10
20787/20787 [==============================] - 128s - loss: 0.1122 - acc: 0.9597 - val_loss: 0.3130 - val_acc: 0.8903
Epoch 10/10
20787/20787 [==============================] - 128s - loss: 0.1088 - acc: 0.9605 - val_loss: 0.3053 - val_acc: 0.8947
In [10]:
from IPython.display import SVG
from keras.utils.vis_utils import model_to_dot
from keras.models import *

model = load_model("models/inceptionV3-mymodel.h5")
print("load successed")

SVG(model_to_dot(model).create(prog='dot', format='svg'))
load successed
Out[10]:
G 140169056115344 input_2: InputLayer 140169056115456 conv2d_95: Conv2D 140169056115344->140169056115456 140169056116184 batch_normalization_95: BatchNormalization 140169056115456->140169056116184 140169056115848 activation_95: Activation 140169056116184->140169056115848 140169056116520 conv2d_96: Conv2D 140169056115848->140169056116520 140169056162648 batch_normalization_96: BatchNormalization 140169056116520->140169056162648 140169056162872 activation_96: Activation 140169056162648->140169056162872 140169056162984 conv2d_97: Conv2D 140169056162872->140169056162984 140169056163432 batch_normalization_97: BatchNormalization 140169056162984->140169056163432 140169056163768 activation_97: Activation 140169056163432->140169056163768 140169056163824 max_pooling2d_5: MaxPooling2D 140169056163768->140169056163824 140169056163992 conv2d_98: Conv2D 140169056163824->140169056163992 140169056164328 batch_normalization_98: BatchNormalization 140169056163992->140169056164328 140169056164664 activation_98: Activation 140169056164328->140169056164664 140169056164720 conv2d_99: Conv2D 140169056164664->140169056164720 140169056165056 batch_normalization_99: BatchNormalization 140169056164720->140169056165056 140169056165392 activation_99: Activation 140169056165056->140169056165392 140169056165448 max_pooling2d_6: MaxPooling2D 140169056165392->140169056165448 140169056165616 conv2d_103: Conv2D 140169056165448->140169056165616 140169056207368 conv2d_101: Conv2D 140169056165448->140169056207368 140169056208824 average_pooling2d_10: AveragePooling2D 140169056165448->140169056208824 140169056208992 conv2d_100: Conv2D 140169056165448->140169056208992 140169056116576 batch_normalization_103: BatchNormalization 140169056165616->140169056116576 140169056207312 activation_103: Activation 140169056116576->140169056207312 140169056207704 conv2d_104: Conv2D 140169056207312->140169056207704 140169056208096 batch_normalization_101: BatchNormalization 140169056207368->140169056208096 140169056208432 batch_normalization_104: BatchNormalization 140169056207704->140169056208432 140169056208712 activation_101: Activation 140169056208096->140169056208712 140169056208768 activation_104: Activation 140169056208432->140169056208768 140169056209328 conv2d_102: Conv2D 140169056208712->140169056209328 140169056209720 conv2d_105: Conv2D 140169056208768->140169056209720 140169056210112 conv2d_106: Conv2D 140169056208824->140169056210112 140169056210504 batch_normalization_100: BatchNormalization 140169056208992->140169056210504 140169056210840 batch_normalization_102: BatchNormalization 140169056209328->140169056210840 140169056165784 batch_normalization_105: BatchNormalization 140169056209720->140169056165784 140169056236040 batch_normalization_106: BatchNormalization 140169056210112->140169056236040 140169056236320 activation_100: Activation 140169056210504->140169056236320 140169056236376 activation_102: Activation 140169056210840->140169056236376 140169056236432 activation_105: Activation 140169056165784->140169056236432 140169056236488 activation_106: Activation 140169056236040->140169056236488 140169056236544 mixed0: Concatenate 140169056236320->140169056236544 140169056236376->140169056236544 140169056236432->140169056236544 140169056236488->140169056236544 140169056236600 conv2d_110: Conv2D 140169056236544->140169056236600 140169056237328 conv2d_108: Conv2D 140169056236544->140169056237328 140169056238784 average_pooling2d_11: AveragePooling2D 140169056236544->140169056238784 140169056238952 conv2d_107: Conv2D 140169056236544->140169056238952 140169056236936 batch_normalization_110: BatchNormalization 140169056236600->140169056236936 140169056237272 activation_110: Activation 140169056236936->140169056237272 140169056237664 conv2d_111: Conv2D 140169056237272->140169056237664 140169056238056 batch_normalization_108: BatchNormalization 140169056237328->140169056238056 140169056238392 batch_normalization_111: BatchNormalization 140169056237664->140169056238392 140169056238672 activation_108: Activation 140169056238056->140169056238672 140169056238728 activation_111: Activation 140169056238392->140169056238728 140169056239288 conv2d_109: Conv2D 140169056238672->140169056239288 140169056210896 conv2d_112: Conv2D 140169056238728->140169056210896 140169056272904 conv2d_113: Conv2D 140169056238784->140169056272904 140169056273296 batch_normalization_107: BatchNormalization 140169056238952->140169056273296 140169056273632 batch_normalization_109: BatchNormalization 140169056239288->140169056273632 140169056273912 batch_normalization_112: BatchNormalization 140169056210896->140169056273912 140169056274192 batch_normalization_113: BatchNormalization 140169056272904->140169056274192 140169056274472 activation_107: Activation 140169056273296->140169056274472 140169056274528 activation_109: Activation 140169056273632->140169056274528 140169056274584 activation_112: Activation 140169056273912->140169056274584 140169056274640 activation_113: Activation 140169056274192->140169056274640 140169056274696 mixed1: Concatenate 140169056274472->140169056274696 140169056274528->140169056274696 140169056274584->140169056274696 140169056274640->140169056274696 140169056274752 conv2d_117: Conv2D 140169056274696->140169056274752 140169056275480 conv2d_115: Conv2D 140169056274696->140169056275480 140169056322056 average_pooling2d_12: AveragePooling2D 140169056274696->140169056322056 140169056322224 conv2d_114: Conv2D 140169056274696->140169056322224 140169056275088 batch_normalization_117: BatchNormalization 140169056274752->140169056275088 140169056275424 activation_117: Activation 140169056275088->140169056275424 140169056275816 conv2d_118: Conv2D 140169056275424->140169056275816 140169056276208 batch_normalization_115: BatchNormalization 140169056275480->140169056276208 140169056239512 batch_normalization_118: BatchNormalization 140169056275816->140169056239512 140169056321944 activation_115: Activation 140169056276208->140169056321944 140169056322000 activation_118: Activation 140169056239512->140169056322000 140169056322560 conv2d_116: Conv2D 140169056321944->140169056322560 140169056322952 conv2d_119: Conv2D 140169056322000->140169056322952 140169056323344 conv2d_120: Conv2D 140169056322056->140169056323344 140169056323736 batch_normalization_114: BatchNormalization 140169056322224->140169056323736 140169056324072 batch_normalization_116: BatchNormalization 140169056322560->140169056324072 140169056324352 batch_normalization_119: BatchNormalization 140169056322952->140169056324352 140169056324632 batch_normalization_120: BatchNormalization 140169056323344->140169056324632 140169056324912 activation_114: Activation 140169056323736->140169056324912 140169056324968 activation_116: Activation 140169056324072->140169056324968 140169056325024 activation_119: Activation 140169056324352->140169056325024 140169056325080 activation_120: Activation 140169056324632->140169056325080 140169056325136 mixed2: Concatenate 140169056324912->140169056325136 140169056324968->140169056325136 140169056325024->140169056325136 140169056325080->140169056325136 140169056325192 conv2d_122: Conv2D 140169056325136->140169056325192 140169056879672 conv2d_121: Conv2D 140169056325136->140169056879672 140169056881128 max_pooling2d_7: MaxPooling2D 140169056325136->140169056881128 140169056276432 batch_normalization_122: BatchNormalization 140169056325192->140169056276432 140169056878888 activation_122: Activation 140169056276432->140169056878888 140169056878944 conv2d_123: Conv2D 140169056878888->140169056878944 140169056879280 batch_normalization_123: BatchNormalization 140169056878944->140169056879280 140169056879616 activation_123: Activation 140169056879280->140169056879616 140169056880008 conv2d_124: Conv2D 140169056879616->140169056880008 140169056880400 batch_normalization_121: BatchNormalization 140169056879672->140169056880400 140169056880736 batch_normalization_124: BatchNormalization 140169056880008->140169056880736 140169056881016 activation_121: Activation 140169056880400->140169056881016 140169056881072 activation_124: Activation 140169056880736->140169056881072 140169056881296 mixed3: Concatenate 140169056881016->140169056881296 140169056881072->140169056881296 140169056881128->140169056881296 140169056881352 conv2d_129: Conv2D 140169056881296->140169056881352 140169056907448 conv2d_126: Conv2D 140169056881296->140169056907448 140169056910360 average_pooling2d_13: AveragePooling2D 140169056881296->140169056910360 140169056910528 conv2d_125: Conv2D 140169056881296->140169056910528 140169056881688 batch_normalization_129: BatchNormalization 140169056881352->140169056881688 140169056882024 activation_129: Activation 140169056881688->140169056882024 140169056882080 conv2d_130: Conv2D 140169056882024->140169056882080 140169056882416 batch_normalization_130: BatchNormalization 140169056882080->140169056882416 140169056325528 activation_130: Activation 140169056882416->140169056325528 140169056907784 conv2d_131: Conv2D 140169056325528->140169056907784 140169056908176 batch_normalization_126: BatchNormalization 140169056907448->140169056908176 140169056908512 batch_normalization_131: BatchNormalization 140169056907784->140169056908512 140169056908792 activation_126: Activation 140169056908176->140169056908792 140169056908848 activation_131: Activation 140169056908512->140169056908848 140169056908904 conv2d_127: Conv2D 140169056908792->140169056908904 140169056909240 conv2d_132: Conv2D 140169056908848->140169056909240 140169056909632 batch_normalization_127: BatchNormalization 140169056908904->140169056909632 140169056909968 batch_normalization_132: BatchNormalization 140169056909240->140169056909968 140169056910248 activation_127: Activation 140169056909632->140169056910248 140169056910304 activation_132: Activation 140169056909968->140169056910304 140169056910864 conv2d_128: Conv2D 140169056910248->140169056910864 140169056882640 conv2d_133: Conv2D 140169056910304->140169056882640 140169056932192 conv2d_134: Conv2D 140169056910360->140169056932192 140169056932584 batch_normalization_125: BatchNormalization 140169056910528->140169056932584 140169056932920 batch_normalization_128: BatchNormalization 140169056910864->140169056932920 140169056933200 batch_normalization_133: BatchNormalization 140169056882640->140169056933200 140169056933480 batch_normalization_134: BatchNormalization 140169056932192->140169056933480 140169056911256 activation_125: Activation 140169056932584->140169056911256 140169056933760 activation_128: Activation 140169056932920->140169056933760 140169056933816 activation_133: Activation 140169056933200->140169056933816 140169056933872 activation_134: Activation 140169056933480->140169056933872 140169056933928 mixed4: Concatenate 140169056911256->140169056933928 140169056933760->140169056933928 140169056933816->140169056933928 140169056933872->140169056933928 140169056933984 conv2d_139: Conv2D 140169056933928->140169056933984 140169056935440 conv2d_136: Conv2D 140169056933928->140169056935440 140169056967088 average_pooling2d_14: AveragePooling2D 140169056933928->140169056967088 140169056967256 conv2d_135: Conv2D 140169056933928->140169056967256 140169056934320 batch_normalization_139: BatchNormalization 140169056933984->140169056934320 140169056934656 activation_139: Activation 140169056934320->140169056934656 140169056934712 conv2d_140: Conv2D 140169056934656->140169056934712 140169056935048 batch_normalization_140: BatchNormalization 140169056934712->140169056935048 140169056935384 activation_140: Activation 140169056935048->140169056935384 140169056935776 conv2d_141: Conv2D 140169056935384->140169056935776 140169056964904 batch_normalization_136: BatchNormalization 140169056935440->140169056964904 140169056965240 batch_normalization_141: BatchNormalization 140169056935776->140169056965240 140169056965520 activation_136: Activation 140169056964904->140169056965520 140169056965576 activation_141: Activation 140169056965240->140169056965576 140169056965632 conv2d_137: Conv2D 140169056965520->140169056965632 140169056965968 conv2d_142: Conv2D 140169056965576->140169056965968 140169056966360 batch_normalization_137: BatchNormalization 140169056965632->140169056966360 140169056966696 batch_normalization_142: BatchNormalization 140169056965968->140169056966696 140169056966976 activation_137: Activation 140169056966360->140169056966976 140169056967032 activation_142: Activation 140169056966696->140169056967032 140169056967592 conv2d_138: Conv2D 140169056966976->140169056967592 140169056967984 conv2d_143: Conv2D 140169056967032->140169056967984 140169056968376 conv2d_144: Conv2D 140169056967088->140169056968376 140170709020288 batch_normalization_135: BatchNormalization 140169056967256->140170709020288 140169056993744 batch_normalization_138: BatchNormalization 140169056967592->140169056993744 140169056994024 batch_normalization_143: BatchNormalization 140169056967984->140169056994024 140169056994304 batch_normalization_144: BatchNormalization 140169056968376->140169056994304 140169056994584 activation_135: Activation 140170709020288->140169056994584 140169056994640 activation_138: Activation 140169056993744->140169056994640 140169056994696 activation_143: Activation 140169056994024->140169056994696 140169056994752 activation_144: Activation 140169056994304->140169056994752 140169056994808 mixed5: Concatenate 140169056994584->140169056994808 140169056994640->140169056994808 140169056994696->140169056994808 140169056994752->140169056994808 140169056994864 conv2d_149: Conv2D 140169056994808->140169056994864 140169056996320 conv2d_146: Conv2D 140169056994808->140169056996320 140169057023872 average_pooling2d_15: AveragePooling2D 140169056994808->140169057023872 140169057024040 conv2d_145: Conv2D 140169056994808->140169057024040 140169056995200 batch_normalization_149: BatchNormalization 140169056994864->140169056995200 140169056995536 activation_149: Activation 140169056995200->140169056995536 140169056995592 conv2d_150: Conv2D 140169056995536->140169056995592 140169056995928 batch_normalization_150: BatchNormalization 140169056995592->140169056995928 140169056996264 activation_150: Activation 140169056995928->140169056996264 140169056996656 conv2d_151: Conv2D 140169056996264->140169056996656 140169056997048 batch_normalization_146: BatchNormalization 140169056996320->140169056997048 140169056968600 batch_normalization_151: BatchNormalization 140169056996656->140169056968600 140169057022304 activation_146: Activation 140169056997048->140169057022304 140169057022360 activation_151: Activation 140169056968600->140169057022360 140169057022416 conv2d_147: Conv2D 140169057022304->140169057022416 140169057022752 conv2d_152: Conv2D 140169057022360->140169057022752 140169057023144 batch_normalization_147: BatchNormalization 140169057022416->140169057023144 140169057023480 batch_normalization_152: BatchNormalization 140169057022752->140169057023480 140169057023760 activation_147: Activation 140169057023144->140169057023760 140169057023816 activation_152: Activation 140169057023480->140169057023816 140169057024376 conv2d_148: Conv2D 140169057023760->140169057024376 140169057024768 conv2d_153: Conv2D 140169057023816->140169057024768 140169057025160 conv2d_154: Conv2D 140169057023872->140169057025160 140169057025552 batch_normalization_145: BatchNormalization 140169057024040->140169057025552 140169057025888 batch_normalization_148: BatchNormalization 140169057024376->140169057025888 140169056997328 batch_normalization_153: BatchNormalization 140169057024768->140169056997328 140169057067472 batch_normalization_154: BatchNormalization 140169057025160->140169057067472 140169057067752 activation_145: Activation 140169057025552->140169057067752 140169057067808 activation_148: Activation 140169057025888->140169057067808 140169057067864 activation_153: Activation 140169056997328->140169057067864 140169057067920 activation_154: Activation 140169057067472->140169057067920 140169057067976 mixed6: Concatenate 140169057067752->140169057067976 140169057067808->140169057067976 140169057067864->140169057067976 140169057067920->140169057067976 140169057068032 conv2d_159: Conv2D 140169057067976->140169057068032 140169057069376 conv2d_156: Conv2D 140169057067976->140169057069376 140169057088736 average_pooling2d_16: AveragePooling2D 140169057067976->140169057088736 140169057088904 conv2d_155: Conv2D 140169057067976->140169057088904 140169057068368 batch_normalization_159: BatchNormalization 140169057068032->140169057068368 140169057026000 activation_159: Activation 140169057068368->140169057026000 140169057068648 conv2d_160: Conv2D 140169057026000->140169057068648 140169057068984 batch_normalization_160: BatchNormalization 140169057068648->140169057068984 140169057069320 activation_160: Activation 140169057068984->140169057069320 140169057069712 conv2d_161: Conv2D 140169057069320->140169057069712 140169057070104 batch_normalization_156: BatchNormalization 140169057069376->140169057070104 140169057070440 batch_normalization_161: BatchNormalization 140169057069712->140169057070440 140169057070720 activation_156: Activation 140169057070104->140169057070720 140169057070776 activation_161: Activation 140169057070440->140169057070776 140169057070832 conv2d_157: Conv2D 140169057070720->140169057070832 140176806336048 conv2d_162: Conv2D 140169057070776->140176806336048 140169057088008 batch_normalization_157: BatchNormalization 140169057070832->140169057088008 140169057088344 batch_normalization_162: BatchNormalization 140176806336048->140169057088344 140169057088624 activation_157: Activation 140169057088008->140169057088624 140169057088680 activation_162: Activation 140169057088344->140169057088680 140169057089240 conv2d_158: Conv2D 140169057088624->140169057089240 140169057089632 conv2d_163: Conv2D 140169057088680->140169057089632 140169057090024 conv2d_164: Conv2D 140169057088736->140169057090024 140169057090416 batch_normalization_155: BatchNormalization 140169057088904->140169057090416 140169057090752 batch_normalization_158: BatchNormalization 140169057089240->140169057090752 140169057091032 batch_normalization_163: BatchNormalization 140169057089632->140169057091032 140169057091312 batch_normalization_164: BatchNormalization 140169057090024->140169057091312 140169057071000 activation_155: Activation 140169057090416->140169057071000 140169057116288 activation_158: Activation 140169057090752->140169057116288 140169057116344 activation_163: Activation 140169057091032->140169057116344 140169057116400 activation_164: Activation 140169057091312->140169057116400 140169057116456 mixed7: Concatenate 140169057071000->140169057116456 140169057116288->140169057116456 140169057116344->140169057116456 140169057116400->140169057116456 140169057116512 conv2d_167: Conv2D 140169057116456->140169057116512 140169057117968 conv2d_165: Conv2D 140169057116456->140169057117968 140169057415968 max_pooling2d_8: MaxPooling2D 140169057116456->140169057415968 140169057116848 batch_normalization_167: BatchNormalization 140169057116512->140169057116848 140169057117184 activation_167: Activation 140169057116848->140169057117184 140169057117240 conv2d_168: Conv2D 140169057117184->140169057117240 140169057117576 batch_normalization_168: BatchNormalization 140169057117240->140169057117576 140169057117912 activation_168: Activation 140169057117576->140169057117912 140169057118304 conv2d_169: Conv2D 140169057117912->140169057118304 140169057118696 batch_normalization_165: BatchNormalization 140169057117968->140169057118696 140169057119032 batch_normalization_169: BatchNormalization 140169057118304->140169057119032 140169057119312 activation_165: Activation 140169057118696->140169057119312 140169057119368 activation_169: Activation 140169057119032->140169057119368 140169057119424 conv2d_166: Conv2D 140169057119312->140169057119424 140169057119760 conv2d_170: Conv2D 140169057119368->140169057119760 140169057091536 batch_normalization_166: BatchNormalization 140169057119424->140169057091536 140169057415520 batch_normalization_170: BatchNormalization 140169057119760->140169057415520 140169057415856 activation_166: Activation 140169057091536->140169057415856 140169057415912 activation_170: Activation 140169057415520->140169057415912 140169057415800 mixed8: Concatenate 140169057415856->140169057415800 140169057415912->140169057415800 140169057415968->140169057415800 140169057416080 conv2d_175: Conv2D 140169057415800->140169057416080 140169057416696 conv2d_172: Conv2D 140169057415800->140169057416696 140169057448512 average_pooling2d_17: AveragePooling2D 140169057415800->140169057448512 140169057448736 conv2d_171: Conv2D 140169057415800->140169057448736 140169057416472 batch_normalization_175: BatchNormalization 140169057416080->140169057416472 140169057416808 activation_175: Activation 140169057416472->140169057416808 140169057417144 conv2d_176: Conv2D 140169057416808->140169057417144 140169057417592 batch_normalization_172: BatchNormalization 140169057416696->140169057417592 140169057417648 batch_normalization_176: BatchNormalization 140169057417144->140169057417648 140169057418152 activation_172: Activation 140169057417592->140169057418152 140169057418208 activation_176: Activation 140169057417648->140169057418208 140169057418320 conv2d_173: Conv2D 140169057418152->140169057418320 140169057418600 conv2d_174: Conv2D 140169057418152->140169057418600 140169057418992 conv2d_177: Conv2D 140169057418208->140169057418992 140169057120152 conv2d_178: Conv2D 140169057418208->140169057120152 140169057449072 batch_normalization_173: BatchNormalization 140169057418320->140169057449072 140169057449408 batch_normalization_174: BatchNormalization 140169057418600->140169057449408 140169057449688 batch_normalization_177: BatchNormalization 140169057418992->140169057449688 140169057449968 batch_normalization_178: BatchNormalization 140169057120152->140169057449968 140169057450248 conv2d_179: Conv2D 140169057448512->140169057450248 140169057450584 batch_normalization_171: BatchNormalization 140169057448736->140169057450584 140169057450920 activation_173: Activation 140169057449072->140169057450920 140169057450976 activation_174: Activation 140169057449408->140169057450976 140169057451032 activation_177: Activation 140169057449688->140169057451032 140169057451088 activation_178: Activation 140169057449968->140169057451088 140169057451144 batch_normalization_179: BatchNormalization 140169057450248->140169057451144 140169057451424 activation_171: Activation 140169057450584->140169057451424 140169057451480 mixed9_0: Concatenate 140169057450920->140169057451480 140169057450976->140169057451480 140169057451536 concatenate_3: Concatenate 140169057451032->140169057451536 140169057451088->140169057451536 140169057451592 activation_179: Activation 140169057451144->140169057451592 140169057451648 mixed9: Concatenate 140169057451424->140169057451648 140169057451480->140169057451648 140169057451536->140169057451648 140169057451592->140169057451648 140169057451704 conv2d_184: Conv2D 140169057451648->140169057451704 140169057481168 conv2d_181: Conv2D 140169057451648->140169057481168 140169057484136 average_pooling2d_18: AveragePooling2D 140169057451648->140169057484136 140169057484360 conv2d_180: Conv2D 140169057451648->140169057484360 140169057419160 batch_normalization_184: BatchNormalization 140169057451704->140169057419160 140169057481112 activation_184: Activation 140169057419160->140169057481112 140169057481504 conv2d_185: Conv2D 140169057481112->140169057481504 140169057481896 batch_normalization_181: BatchNormalization 140169057481168->140169057481896 140169057482232 batch_normalization_185: BatchNormalization 140169057481504->140169057482232 140169057482512 activation_181: Activation 140169057481896->140169057482512 140169057482568 activation_185: Activation 140169057482232->140169057482568 140169057482624 conv2d_182: Conv2D 140169057482512->140169057482624 140169057482960 conv2d_183: Conv2D 140169057482512->140169057482960 140169057483352 conv2d_186: Conv2D 140169057482568->140169057483352 140169057483744 conv2d_187: Conv2D 140169057482568->140169057483744 140169057451872 batch_normalization_182: BatchNormalization 140169057482624->140169057451872 140169057509672 batch_normalization_183: BatchNormalization 140169057482960->140169057509672 140169057509952 batch_normalization_186: BatchNormalization 140169057483352->140169057509952 140169057510232 batch_normalization_187: BatchNormalization 140169057483744->140169057510232 140169057510512 conv2d_188: Conv2D 140169057484136->140169057510512 140169057510848 batch_normalization_180: BatchNormalization 140169057484360->140169057510848 140169057511184 activation_182: Activation 140169057451872->140169057511184 140169057511240 activation_183: Activation 140169057509672->140169057511240 140169057511296 activation_186: Activation 140169057509952->140169057511296 140169057511352 activation_187: Activation 140169057510232->140169057511352 140169057511408 batch_normalization_188: BatchNormalization 140169057510512->140169057511408 140169057511688 activation_180: Activation 140169057510848->140169057511688 140169057511744 mixed9_1: Concatenate 140169057511184->140169057511744 140169057511240->140169057511744 140169057511800 concatenate_4: Concatenate 140169057511296->140169057511800 140169057511352->140169057511800 140169057511856 activation_188: Activation 140169057511408->140169057511856 140169057511912 mixed10: Concatenate 140169057511688->140169057511912 140169057511744->140169057511912 140169057511800->140169057511912 140169057511856->140169057511912 140169057511968 global_average_pooling2d_2: GlobalAveragePooling2D 140169057511912->140169057511968 140169057512080 dropout_2: Dropout 140169057511968->140169057512080 140169057512136 dense_2: Dense 140169057512080->140169057512136

CAM 可视化

http://cnnlocalization.csail.mit.edu/

$cam = (P-0.5)*w*output$

  • cam: 类激活图
  • P: 概率
  • output: 卷积层的输出 2048*1
  • w: 卷积核的权重 x*x*2048
In [11]:
z = zip([x.name for x in model.layers], range(len(model.layers)))
for k, v in z:
    print("{} - {}".format(k,v))
input_2 - 0
conv2d_95 - 1
batch_normalization_95 - 2
activation_95 - 3
conv2d_96 - 4
batch_normalization_96 - 5
activation_96 - 6
conv2d_97 - 7
batch_normalization_97 - 8
activation_97 - 9
max_pooling2d_5 - 10
conv2d_98 - 11
batch_normalization_98 - 12
activation_98 - 13
conv2d_99 - 14
batch_normalization_99 - 15
activation_99 - 16
max_pooling2d_6 - 17
conv2d_103 - 18
batch_normalization_103 - 19
activation_103 - 20
conv2d_101 - 21
conv2d_104 - 22
batch_normalization_101 - 23
batch_normalization_104 - 24
activation_101 - 25
activation_104 - 26
average_pooling2d_10 - 27
conv2d_100 - 28
conv2d_102 - 29
conv2d_105 - 30
conv2d_106 - 31
batch_normalization_100 - 32
batch_normalization_102 - 33
batch_normalization_105 - 34
batch_normalization_106 - 35
activation_100 - 36
activation_102 - 37
activation_105 - 38
activation_106 - 39
mixed0 - 40
conv2d_110 - 41
batch_normalization_110 - 42
activation_110 - 43
conv2d_108 - 44
conv2d_111 - 45
batch_normalization_108 - 46
batch_normalization_111 - 47
activation_108 - 48
activation_111 - 49
average_pooling2d_11 - 50
conv2d_107 - 51
conv2d_109 - 52
conv2d_112 - 53
conv2d_113 - 54
batch_normalization_107 - 55
batch_normalization_109 - 56
batch_normalization_112 - 57
batch_normalization_113 - 58
activation_107 - 59
activation_109 - 60
activation_112 - 61
activation_113 - 62
mixed1 - 63
conv2d_117 - 64
batch_normalization_117 - 65
activation_117 - 66
conv2d_115 - 67
conv2d_118 - 68
batch_normalization_115 - 69
batch_normalization_118 - 70
activation_115 - 71
activation_118 - 72
average_pooling2d_12 - 73
conv2d_114 - 74
conv2d_116 - 75
conv2d_119 - 76
conv2d_120 - 77
batch_normalization_114 - 78
batch_normalization_116 - 79
batch_normalization_119 - 80
batch_normalization_120 - 81
activation_114 - 82
activation_116 - 83
activation_119 - 84
activation_120 - 85
mixed2 - 86
conv2d_122 - 87
batch_normalization_122 - 88
activation_122 - 89
conv2d_123 - 90
batch_normalization_123 - 91
activation_123 - 92
conv2d_121 - 93
conv2d_124 - 94
batch_normalization_121 - 95
batch_normalization_124 - 96
activation_121 - 97
activation_124 - 98
max_pooling2d_7 - 99
mixed3 - 100
conv2d_129 - 101
batch_normalization_129 - 102
activation_129 - 103
conv2d_130 - 104
batch_normalization_130 - 105
activation_130 - 106
conv2d_126 - 107
conv2d_131 - 108
batch_normalization_126 - 109
batch_normalization_131 - 110
activation_126 - 111
activation_131 - 112
conv2d_127 - 113
conv2d_132 - 114
batch_normalization_127 - 115
batch_normalization_132 - 116
activation_127 - 117
activation_132 - 118
average_pooling2d_13 - 119
conv2d_125 - 120
conv2d_128 - 121
conv2d_133 - 122
conv2d_134 - 123
batch_normalization_125 - 124
batch_normalization_128 - 125
batch_normalization_133 - 126
batch_normalization_134 - 127
activation_125 - 128
activation_128 - 129
activation_133 - 130
activation_134 - 131
mixed4 - 132
conv2d_139 - 133
batch_normalization_139 - 134
activation_139 - 135
conv2d_140 - 136
batch_normalization_140 - 137
activation_140 - 138
conv2d_136 - 139
conv2d_141 - 140
batch_normalization_136 - 141
batch_normalization_141 - 142
activation_136 - 143
activation_141 - 144
conv2d_137 - 145
conv2d_142 - 146
batch_normalization_137 - 147
batch_normalization_142 - 148
activation_137 - 149
activation_142 - 150
average_pooling2d_14 - 151
conv2d_135 - 152
conv2d_138 - 153
conv2d_143 - 154
conv2d_144 - 155
batch_normalization_135 - 156
batch_normalization_138 - 157
batch_normalization_143 - 158
batch_normalization_144 - 159
activation_135 - 160
activation_138 - 161
activation_143 - 162
activation_144 - 163
mixed5 - 164
conv2d_149 - 165
batch_normalization_149 - 166
activation_149 - 167
conv2d_150 - 168
batch_normalization_150 - 169
activation_150 - 170
conv2d_146 - 171
conv2d_151 - 172
batch_normalization_146 - 173
batch_normalization_151 - 174
activation_146 - 175
activation_151 - 176
conv2d_147 - 177
conv2d_152 - 178
batch_normalization_147 - 179
batch_normalization_152 - 180
activation_147 - 181
activation_152 - 182
average_pooling2d_15 - 183
conv2d_145 - 184
conv2d_148 - 185
conv2d_153 - 186
conv2d_154 - 187
batch_normalization_145 - 188
batch_normalization_148 - 189
batch_normalization_153 - 190
batch_normalization_154 - 191
activation_145 - 192
activation_148 - 193
activation_153 - 194
activation_154 - 195
mixed6 - 196
conv2d_159 - 197
batch_normalization_159 - 198
activation_159 - 199
conv2d_160 - 200
batch_normalization_160 - 201
activation_160 - 202
conv2d_156 - 203
conv2d_161 - 204
batch_normalization_156 - 205
batch_normalization_161 - 206
activation_156 - 207
activation_161 - 208
conv2d_157 - 209
conv2d_162 - 210
batch_normalization_157 - 211
batch_normalization_162 - 212
activation_157 - 213
activation_162 - 214
average_pooling2d_16 - 215
conv2d_155 - 216
conv2d_158 - 217
conv2d_163 - 218
conv2d_164 - 219
batch_normalization_155 - 220
batch_normalization_158 - 221
batch_normalization_163 - 222
batch_normalization_164 - 223
activation_155 - 224
activation_158 - 225
activation_163 - 226
activation_164 - 227
mixed7 - 228
conv2d_167 - 229
batch_normalization_167 - 230
activation_167 - 231
conv2d_168 - 232
batch_normalization_168 - 233
activation_168 - 234
conv2d_165 - 235
conv2d_169 - 236
batch_normalization_165 - 237
batch_normalization_169 - 238
activation_165 - 239
activation_169 - 240
conv2d_166 - 241
conv2d_170 - 242
batch_normalization_166 - 243
batch_normalization_170 - 244
activation_166 - 245
activation_170 - 246
max_pooling2d_8 - 247
mixed8 - 248
conv2d_175 - 249
batch_normalization_175 - 250
activation_175 - 251
conv2d_172 - 252
conv2d_176 - 253
batch_normalization_172 - 254
batch_normalization_176 - 255
activation_172 - 256
activation_176 - 257
conv2d_173 - 258
conv2d_174 - 259
conv2d_177 - 260
conv2d_178 - 261
average_pooling2d_17 - 262
conv2d_171 - 263
batch_normalization_173 - 264
batch_normalization_174 - 265
batch_normalization_177 - 266
batch_normalization_178 - 267
conv2d_179 - 268
batch_normalization_171 - 269
activation_173 - 270
activation_174 - 271
activation_177 - 272
activation_178 - 273
batch_normalization_179 - 274
activation_171 - 275
mixed9_0 - 276
concatenate_3 - 277
activation_179 - 278
mixed9 - 279
conv2d_184 - 280
batch_normalization_184 - 281
activation_184 - 282
conv2d_181 - 283
conv2d_185 - 284
batch_normalization_181 - 285
batch_normalization_185 - 286
activation_181 - 287
activation_185 - 288
conv2d_182 - 289
conv2d_183 - 290
conv2d_186 - 291
conv2d_187 - 292
average_pooling2d_18 - 293
conv2d_180 - 294
batch_normalization_182 - 295
batch_normalization_183 - 296
batch_normalization_186 - 297
batch_normalization_187 - 298
conv2d_188 - 299
batch_normalization_180 - 300
activation_182 - 301
activation_183 - 302
activation_186 - 303
activation_187 - 304
batch_normalization_188 - 305
activation_180 - 306
mixed9_1 - 307
concatenate_4 - 308
activation_188 - 309
mixed10 - 310
global_average_pooling2d_2 - 311
dropout_2 - 312
dense_2 - 313
In [12]:
import matplotlib.pyplot as plt
import random
%matplotlib inline
%config InlineBackend.figure_format = 'retina'

def show_heatmap_image(model_show, weights_show):
    test_dir = os.path.join(basedir,  "test", "test" )
    image_files = glob.glob(os.path.join(test_dir,"*"))
    print(len(image_files))
    
    plt.figure(figsize=(12, 14))
    for i in range(16):
        plt.subplot(4, 4, i+1)
        img = cv2.imread(image_files[2000*i+113])
        img = cv2.resize(img, (model_image_size, model_image_size))
        x = img.copy()
        x.astype(np.float32)
        out, predictions = model_show.predict(np.expand_dims(x, axis=0))
        predictions = predictions[0]
        out = out[0]
        
        max_idx = np.argmax(predictions)
        prediction = predictions[max_idx]

        status = ["safe driving",  " texting - right",  "phone - right",  "texting - left",  "phone - left",  
                  "operation radio", "drinking", "reaching behind", "hair and makeup", "talking"]

        plt.title('c%d |%s| %.2f%%' % (max_idx , status[max_idx], prediction*100))
    
        cam = (prediction - 0.5) * np.matmul(out, weights_show)
        cam = cam[:,:,max_idx]
        cam -= cam.min()
        cam /= cam.max()
        cam -= 0.2
        cam /= 0.8

        cam = cv2.resize(cam, (model_image_size, model_image_size))
        heatmap = cv2.applyColorMap(np.uint8(255*cam), cv2.COLORMAP_JET)
        heatmap[np.where(cam <= 0.2)] = 0

        out = cv2.addWeighted(img, 0.8, heatmap, 0.4, 0)

        plt.axis('off')
        plt.imshow(out[:,:,::-1])
print("done")
done
In [13]:
weights = model.layers[313].get_weights()[0]
layer_output = model.layers[310].output
model2 = Model(model.input, [layer_output, model.output])
print("layer_output {0}".format(layer_output))
print("weights shape {0}".format(weights.shape))
show_heatmap_image(model2, weights)
layer_output Tensor("mixed10_2/concat:0", shape=(?, 8, 8, 2048), dtype=float32)
weights shape (2048, 10)
79726